home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS11.ADF
/
AmigaBasicProgs
/
Meadows3D.MSB
(
.txt
)
< prev
next >
Wrap
AmigaBASIC Source Code
|
1986-08-05
|
8KB
|
406 lines
' Try3d -- An Example of 3D Programming
' Initial Amiga implementation
' by Jim Meadows 6/1/86 Compuserve [75046,2012]
' 3D Greeting
CLS:PRINT
COLOR 3:PRINT " Try3D";
COLOR 1:PRINT " -- An Example of 3D Programming"
COLOR 1:PRINT " by Jim Meadows"
GOSUB InitVals
GOSUB SetImage
' GOSUB SetImage
' GOTO Manual
ef=-1
ax=10:ay=5:px=180:py=70
GOSUB DrawImage
LOCATE 18,20:COLOR 3:PRINT "Hello!"
GOSUB Pause
ax=10:ay=-30
GOSUB DrawImage
LOCATE 18,3:COLOR 3:PRINT "Welcome to the World of 3D Graphics!"
GOSUB Pause
ax=30:ay=20
GOSUB DrawImage
LOCATE 18,15:COLOR 3:PRINT "Hmmmmmm....."
GOSUB Pause
ax=-30:ay=-15:az=20:di=500
GOSUB DrawImage
LOCATE 18,8:COLOR 3:PRINT "Yep, just as I figured ..."
GOSUB Pause
az=-20:ay=15
GOSUB DrawImage
LOCATE 18,4:COLOR 3:PRINT "You've got what it takes for 3D!"
GOSUB Pause
ax=10:ay=-20:az=0:di=900
GOSUB DrawImage
LOCATE 18,15:COLOR 3:PRINT "You have ..."
GOSUB Pause
ax=-5:ay=0:di=700
GOSUB DrawImage
LOCATE 18,15:COLOR 3:PRINT "... an AMIGA!!"
FOR i = 1 TO 10000:NEXT
ef=0
Ri:
' Rotating Image
CLS
LOCATE 19,13:COLOR 3:PRINT "Delta Wing Fighter"
GOSUB SetImage
' Draw and Undraw rotating image
ax=-90:ay=270:az=0:px=160:py=100
FOR ii = 1 TO 4
GOSUB DrawImage
GOSUB Pause
ef=1
GOSUB DrawImage
ef=0
ax=-20
ay=ay-60
IF ii=1 THEN ax=0:ay=270:az=0
NEXT
Fly:
' Animated flight path
FOR inum = 1 TO 2
IF inum=2 THEN GOSUB SetImage
di=2400
ax=0:ay=270:az=0
px=30:py=30:ef=-1
GOSUB DrawImage
px=px+40:ax=ax-5:di=di-100
GOSUB DrawImage
ax=ax-5:di=di-100
FOR R=1 TO 3
px=px+40:ay=ay-20:di=di-100
GOSUB DrawImage
NEXT
FOR R = 1 TO 3
px=px+30:ay=ay-20:az=az-20:di=di-100
GOSUB DrawImage
NEXT
FOR R=1 TO 4
px=px-20:py=py+10:az=az+10:di=di-80
GOSUB DrawImage
NEXT
FOR R=1 TO 8
px=px-9*R:py=py+10:az=az+5:di=di-60:ax=ax-5
GOSUB DrawImage
NEXT
NEXT
' Finally allow manual control
GOSUB SetImage
Manual:
MENU 1,0,1,"Rotate +"
MENU 1,1,1,"Around X-axis"
MENU 1,2,1,"Around Y-axis"
MENU 1,3,1,"Around Z-axis"
MENU 2,0,1,"Rotate -"
MENU 2,1,1,"Around X-axis"
MENU 2,2,1,"Around Y-axis"
MENU 2,3,1,"Around Z-axis"
MENU 3,0,1,"Move"
MENU 3,1,1,"Closer"
MENU 3,2,1,"Away"
MENU 3,3,1,"Right"
MENU 3,4,1,"Left"
MENU 3,5,1,"Up"
MENU 3,6,1,"Down"
MENU 4,0,1,"Reset"
MENU 4,1,1,"Angles"
MENU 4,2,1,"Distance"
MENU 4,3,1,"Position"
MENU 4,4,1,"Quit"
ON MENU GOSUB Menus
ON MOUSE GOSUB Mous
m1=1:GOSUB Reeset
m1=2:GOSUB Reeset
m1=3:GOSUB Reeset
act=1:ef=-1
MOUSE ON
MENU ON
Loop:
IF act=0 THEN inc=1: GOTO Loop
GOSUB DrawImage
GOSUB Vals
IF MOUSE(0)<>-1 THEN act=0 :ELSE GOSUB Mous
GOTO Loop
'-------------
' Subroutines
'-------------
Vals:
COLOR 1
LOCATE 1,1:PRINT "Ax,Ay,Az: "ax","ay","az
LOCATE 2,1:PRINT "Px,Py : "px","py
LOCATE 3,1:PRINT "Di : "di
COLOR 3
LOCATE 4,1:PRINT "Use Menus to Change View"
COLOR 2
LOCATE 5,1:PRINT "(press left button to repeat)"
RETURN
Menus:
act=1
inc=1
m0=MENU(0)
m1=MENU(1)
ON m0 GOSUB RotateP,RotateM,MoveI,Reeset
RETURN
Mous:
act=1
inc=inc+0.5
ON m0 GOSUB RotateP,RotateM,MoveI,Reeset
RETURN
RotateP:
IF m1=1 THEN ax=ax+10*inc
IF m1=2 THEN ay=ay+10*inc
IF m1=3 THEN az=az+10*inc
RETURN
RotateM:
IF m1=1 THEN ax=ax-10*inc
IF m1=2 THEN ay=ay-10*inc
IF m1=3 THEN az=az-10*inc
RETURN
MoveI:
IF m1=1 THEN di=di-50*inc
IF m1=2 THEN di=di+50*inc
IF m1=3 THEN px=px+20*inc
IF m1=4 THEN px=px-20*inc
IF m1=5 THEN py=py-10*inc
IF m1=6 THEN py=py+10*inc
RETURN
Reeset:
IF m1=1 THEN ax=-15:ay=-25:az=0
IF m1=2 THEN di=1200
IF m1=3 THEN px=160:py=100
IF m1=4 THEN MENU OFF:END
RETURN
Pause:
FOR i = 1 TO 4000:NEXT
RETURN
' ----------------------------------
' | 3-D Routines |
' ----------------------------------
' ax,ay,az = rotation Angle in degrees
' di = distance to image
' dw = distance to window (projection plane)
' px,py = position of image on screen
' sf = screen scaling factor
' ef = erase flag (1=erase, 0=draw, -1=cls & draw)
' Image data is at end of program
InitVals:
' Define Arrays
DIM it%(100,3):' Image Table
DIM rim%(100,3):' Rotated Image
' Initialize Values
x=0:y=0:z=0
dw=400:' Distance to window
di=900:' Distance to image
sf=2.35:' Screen scale factor
ax=0:ay=0:az=0:' Angles in Degrees
px=200:py=100:' x,y Image Location
ef=0:' Erase Flag
f=57.2958:' Degrees to Radians factor
RETURN
DrawImage:
' Draw the Image
GOSUB Rotate
GOSUB DrawIt
RETURN
Rotate:
' First get trig values from angles
sx=SIN(ax/f):cx=COS(ax/f)
sy=SIN(ay/f):cy=COS(ay/f)
sz=SIN(az/f):cz=COS(az/f)
' Then compute rotation values
xRx=cy*cz
yRx=-cy*sz
zRx=-sy
xRy=cx*sz-sx*sy*cz
yRy=cx*cz+sx*sy*sz
zRy=-sx*cy
xRz=sx*sz+cx*sy*cz
yRz=sx*cz-cx*sy*sz
zRz=cx*cy
' Now Rotate Image
np=0
Rotate1:
' Get next point
c=it%(np,0):IF c=-1 THEN RETURN
x=it%(np,1):y=it%(np,2):z=it%(np,3)
' Compute its new location
rim%(np,1)=x*xRx+y*yRx+z*zRx
rim%(np,2)=x*xRy+y*yRy+z*zRy
rim%(np,3)=x*xRz+y*yRz+z*zRz
np=np+1
GOTO Rotate1
DrawIt:
np=0:IF ef=-1 THEN CLS
DrawIt1:
' Check for end of table
c=it%(np,0):IF c=-1 THEN RETURN
' Keep from dividing by zero
IF (rim%(np,3)+di) = 0 THEN rim%(np,3)=rim%(np,3)+1
' Compute screen x & y
xw=px+(rim%(np,1)/(rim%(np,3)+di))*dw*sf
yw=py-(rim%(np,2)/(rim%(np,3)+di))*dw
' Draw next line or move to next point
IF c=0 THEN GOTO JustMove
colr=c:IF ef=1 THEN colr=0
LINE (lx,ly)-(xw,yw),colr
JustMove: lx=xw:ly=yw
np=np+1
GOTO DrawIt1
SetImage:
' Routine to insert an image into the table
n=0
itloop:
READ it%(n,0)
IF it%(n,0)=-1 THEN RETURN
READ it%(n,1),it%(n,2),it%(n,3)
n=n+1:GOTO itloop
' Greeting Image
' Image Data Format:c,x,y,z
' (c=color, if =0 then move w/o drawing)
DATA 0,-50,30,0
DATA 1,-55,35,10
DATA 1,-45,0,0
DATA 1,-20,-60,-30
DATA 1,20,-60,-30
DATA 1,20,-60,-30
DATA 1,45,0,0
DATA 1,55,35,10
DATA 1,50,30,0
DATA 3,30,80,-30
DATA 3,-30,80,-30
DATA 3,-50,30,0
DATA 0,0,22,-30
DATA 1,0,-4,-36
DATA 0,-5,0,-30
DATA 1,0,-4,-36
DATA 1,5,0,-30
DATA 0,-20,30,-25
DATA 1,-35,25,-17
DATA 1,-20,20,-25
DATA 1,-5,25,-21
DATA 1,-20,30,-25
DATA 2,-20,20,-25
DATA 0,20,30,-25
DATA 1,35,25,-17
DATA 1,20,20,-25
DATA 1,5,25,-21
DATA 1,20,30,-25
DATA 2,20,20,-25
DATA 0,-20,-26,-22
DATA 3,0,-34,-30
DATA 3,20,-26,-22
DATA 0,-10,-30,-26
DATA 3,10,-30,-26
DATA -1
' Delta Wing Fighter Image
DATA 0,0,-20,100
DATA 1,0,20,-100
DATA 0,50,-20,-100
DATA 1,0,-20,100
DATA 1,-50,-20,-100
DATA 2,0,20,-100
DATA 2,50,-20,-100
DATA 2,-50,-20,-100
DATA 0,-75,0,-100
DATA 3,0,0,0
DATA 3,75,0,-100
DATA 3,-75,0,-100
DATA -1:' End of Image
' Chaser Image
DATA 0,-25,0,-25
DATA 1,25,0,-25
DATA 1,25,0,25
DATA 1,-25,0,25
DATA 1,-25,0,-25
DATA 0,-25,25,25
DATA 3,-25,-25,25
DATA 3,-25,-25,-25
DATA 3,-25,25,-25
DATA 3,-25,25,25
DATA 0,25,25,25
DATA 3,25,-25,25
DATA 3,25,-25,-25
DATA 3,25,25,-25
DATA 3,25,25,25
DATA 0,0,0,-25
DATA 2,0,0,50
DATA 2,0,10,25
DATA 2,0,0,-25
DATA -1
' XYZ axis Image
DATA 0,-100,0,0
DATA 1,100,0,0
DATA 1,80,-20,0
DATA 0,100,0,0
DATA 1,80,20,0
DATA 0,140,14,0
DATA 1,170,-16,0
DATA 0,140,-16,0
DATA 1,170,14,0
DATA 0,0,-100,0
DATA 2,0,100,0
DATA 2,20,80,0
DATA 0,0,100,0
DATA 2,-20,80,0
DATA 0,0,120,0
DATA 2,0,134,0
DATA 2,14,148,0
DATA 0,0,134,0
DATA 2,-14,148,0
DATA 0,0,0,100
DATA 3,0,0,-100
DATA 3,0,-20,-80
DATA 0,0,0,-100
DATA 3,0,20,-80
DATA 0,-14,14,-140
DATA 3,16,14,-140
DATA 3,-14,-16,-140
DATA 3,16,-16,-140
DATA -1